package com.snail.clouds.api.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snail.clouds.framework.api.ApiResponse;
import com.snail.clouds.framework.dto.CloudAccountDTO;
import com.snail.clouds.framework.entity.CloudAccount;
import com.snail.clouds.framework.service.CloudAccountService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 云存储账户管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/cloud-accounts")
public class CloudAccountController {

    @Autowired
    private CloudAccountService cloudAccountService;

    /**
     * 获取当前用户的云存储账户列表
     *
     * @param request HTTP请求
     * @return 云存储账户列表
     */
    @GetMapping("/current")
    public ApiResponse<List<CloudAccountDTO>> getCurrentUserCloudAccounts(HttpServletRequest request) {
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            return ApiResponse.error("未获取到用户信息");
        }
        
        // 直接使用Service中的自定义方法
        List<CloudAccount> accounts = cloudAccountService.getByUserId(userId);
        
        // 使用DTO的convert方法进行转换
        List<CloudAccountDTO> result = accounts.stream()
                .map(CloudAccountDTO::convert)
                .collect(Collectors.toList());
                
        return ApiResponse.success(result);
    }

    /**
     * 分页查询云存储账户列表
     *
     * @param page   页码
     * @param size   每页大小
     * @param userId 用户ID
     * @return 云存储账户分页数据
     */
    @GetMapping
    public ApiResponse<IPage<CloudAccountDTO>> getCloudAccountPage(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) Long userId) {

        // 创建分页对象
        Page<CloudAccount> pageParam = new Page<>(page, size);
        
        // 构造查询条件
        com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<CloudAccount> queryWrapper = 
            new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<>();
        
        // 如果提供了用户ID，则根据用户ID进行查询
        if (userId != null) {
            queryWrapper.eq("user_id", userId);
        }
        
        // 查询数据
        IPage<CloudAccount> accountPage = cloudAccountService.page(pageParam, queryWrapper);
        
        // 转换为DTO分页结果
        Page<CloudAccountDTO> dtoPage = new Page<>(accountPage.getCurrent(), accountPage.getSize(), accountPage.getTotal());
        dtoPage.setRecords(accountPage.getRecords().stream()
                .map(CloudAccountDTO::convert)
                .collect(Collectors.toList()));
        
        return ApiResponse.success(dtoPage);
    }

    /**
     * 根据用户ID获取云存储账户列表
     *
     * @param userId 用户ID
     * @return 云存储账户列表
     */
    @GetMapping("/user/{userId}")
    public ApiResponse<List<CloudAccountDTO>> getCloudAccountsByUserId(@PathVariable Long userId) {
        // 直接使用Service中的自定义方法
        List<CloudAccount> accounts = cloudAccountService.getByUserId(userId);
        
        // 使用DTO的convert方法进行转换
        List<CloudAccountDTO> result = accounts.stream()
                .map(CloudAccountDTO::convert)
                .collect(Collectors.toList());
                
        return ApiResponse.success(result);
    }

    /**
     * 创建云存储账户
     *
     * @param cloudAccountDTO 云存储账户信息
     * @return 是否创建成功
     */
    @PostMapping
    public ApiResponse<Void> createCloudAccount(@Valid @RequestBody CloudAccountDTO cloudAccountDTO) {
        // 使用DTO的convertToEntity方法进行转换
        CloudAccount account = CloudAccountDTO.convertToEntity(cloudAccountDTO);
        
        // 使用MyBatis Plus的通用保存方法
        boolean result = cloudAccountService.save(account);
        if (result) {
            return ApiResponse.success("云存储账户创建成功", null);
        } else {
            return ApiResponse.error("云存储账户创建失败");
        }
    }

    /**
     * 更新云存储账户信息
     *
     * @param id              账户ID
     * @param cloudAccountDTO 云存储账户信息
     * @return 是否更新成功
     */
    @PutMapping("/{id}")
    public ApiResponse<Void> updateCloudAccount(@PathVariable Long id,
                                                @Valid @RequestBody CloudAccountDTO cloudAccountDTO) {
        // 使用DTO的convertToEntity方法进行转换
        CloudAccount account = CloudAccountDTO.convertToEntity(cloudAccountDTO);
        account.setId(id);
        
        // 使用MyBatis Plus的通用更新方法
        boolean result = cloudAccountService.updateById(account);
        if (result) {
            return ApiResponse.success("云存储账户更新成功", null);
        } else {
            return ApiResponse.error("云存储账户更新失败");
        }
    }

    /**
     * 删除云存储账户
     *
     * @param id 账户ID
     * @return 是否删除成功
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteCloudAccount(@PathVariable Long id) {
        // 使用MyBatis Plus的通用删除方法
        boolean result = cloudAccountService.removeById(id);
        if (result) {
            return ApiResponse.success("云存储账户删除成功", null);
        } else {
            return ApiResponse.error("云存储账户删除失败");
        }
    }
}